package com.ruoyi.system.mapper;

import java.util.List;
import com.ruoyi.system.domain.Application;
import org.apache.ibatis.annotations.Param;

/**
 * 志愿申请Mapper接口
 *
 * @author ltr
 * @date 2024-10-23
 */
public interface ApplicationMapper
{
    /**
     * 查询志愿申请
     *
     * @param applicationId 志愿申请主键
     * @return 志愿申请
     */
    public Application selectApplicationByApplicationId(Long applicationId);

    /**
     * 查询志愿申请列表（管理员使用）
     *
     * @param application 志愿申请
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationList(Application application);

    /**
     * 查询学生的志愿申请列表
     *
     * @param studentId 学生ID
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationListByStudentId(Long studentId);

    /**
     * 查询教师的题目下的申请列表
     *
     * @param teacherId 教师ID
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationListByTeacherId(Long teacherId);

    /**
     * 查询指定题目的申请列表
     *
     * @param topicId 题目ID
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationListByTopicId(Long topicId);

    /**
     * 查询教师已录取的学生列表
     *
     * @param teacherId 教师ID
     * @return 志愿申请集合
     */
    public List<Application> selectAcceptedStudentsByTeacherId(Long teacherId);

    /**
     * 查询学生是否已被录取
     *
     * @param studentId 学生ID
     * @return 已录取的申请
     */
    public Application selectAcceptedApplicationByStudentId(Long studentId);

    /**
     * 检查学生是否已报名该题目
     *
     * @param studentId 学生ID
     * @param topicId 题目ID
     * @return 申请记录数
     */
    public int checkStudentApplied(@Param("studentId") Long studentId,
                                   @Param("topicId") Long topicId);

    /**
     * 查询学生对该题目的已取消或已拒绝的申请记录
     *
     * @param studentId 学生ID
     * @param topicId 题目ID
     * @return 申请记录
     */
    public Application selectCanceledOrRejectedApplication(@Param("studentId") Long studentId,
                                                           @Param("topicId") Long topicId);

    /**
     * 统计学生某个优先级的志愿数量
     *
     * @param studentId 学生ID
     * @param priority 优先级
     * @return 志愿数量
     */
    public int countStudentApplicationsByPriority(@Param("studentId") Long studentId,
                                                  @Param("priority") Integer priority);

    /**
     * 统计学生的有效志愿总数（待审核+已录取）
     *
     * @param studentId 学生ID
     * @return 志愿数量
     */
    public int countStudentActiveApplications(Long studentId);

    /**
     * 新增志愿申请
     *
     * @param application 志愿申请
     * @return 结果
     */
    public int insertApplication(Application application);

    /**
     * 修改志愿申请
     *
     * @param application 志愿申请
     * @return 结果
     */
    public int updateApplication(Application application);

    /**
     * 删除志愿申请
     *
     * @param applicationId 志愿申请主键
     * @return 结果
     */
    public int deleteApplicationByApplicationId(Long applicationId);

    /**
     * 批量删除志愿申请
     *
     * @param applicationIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteApplicationByApplicationIds(Long[] applicationIds);

    /**
     * 更新志愿申请状态
     *
     * @param applicationId 申请ID
     * @param status 状态
     * @return 结果
     */
    public int updateApplicationStatus(@Param("applicationId") Long applicationId,
                                       @Param("status") String status);

    /**
     * 教师审核志愿申请（录取）
     *
     * @param applicationId 申请ID
     * @param reviewBy 审核人
     * @return 结果
     */
    public int acceptApplication(@Param("applicationId") Long applicationId,
                                 @Param("reviewBy") String reviewBy);

    /**
     * 教师审核志愿申请（拒绝）
     *
     * @param applicationId 申请ID
     * @param reviewReason 拒绝理由
     * @param reviewBy 审核人
     * @return 结果
     */
    public int rejectApplication(@Param("applicationId") Long applicationId,
                                 @Param("reviewReason") String reviewReason,
                                 @Param("reviewBy") String reviewBy);

    /**
     * 将学生的其他志愿设置为已失效
     *
     * @param studentId 学生ID
     * @param applicationId 保留的申请ID
     * @return 结果
     */
    public int invalidateOtherApplications(@Param("studentId") Long studentId,
                                           @Param("applicationId") Long applicationId);

    /**
     * 检查申请是否属于指定学生
     *
     * @param applicationId 申请ID
     * @param studentId 学生ID
     * @return 结果
     */
    public int checkApplicationOwner(@Param("applicationId") Long applicationId,
                                     @Param("studentId") Long studentId);

    /**
     * 检查申请是否属于指定教师的题目
     *
     * @param applicationId 申请ID
     * @param teacherId 教师ID
     * @return 结果
     */
    public int checkApplicationBelongsToTeacher(@Param("applicationId") Long applicationId,
                                                @Param("teacherId") Long teacherId);
}